from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, FileResponse
from fastapi.staticfiles import StaticFiles

"""
api/main_routes.py
处理主要路由和静态资源的配置
包括主页、查询页面、上传页面、分类管理页面等基础页面的路由注册
"""

# 注册主页和静态页面路由
def register_main_routes(app: FastAPI, config_service):
    """
    注册主要路由和静态资源
    包括静态文件挂载、错误处理和基础页面路由
    
    :param app: FastAPI应用实例
    """
    # 挂载静态文件目录，用于提供CSS、JavaScript等静态资源
    app.mount("/static", StaticFiles(directory="static"), name="static")
    # 挂载saved_images目录，用于访问已保存的图片
    # saved_images_dir = config_service.get('saved_images', 'saved_images_dir')
    saved_images_dir = config_service.get_saved_images_config()['saved_images_dir']
    app.mount("/saved_images", StaticFiles(directory=saved_images_dir), name="saved_images")
    
    # 注意：我们保留这个处理器是因为它在main_routes.py中定义的位置靠前
    # 在统一异常处理中间件设置之前就会被注册，需要确保与中间件的处理逻辑一致
    @app.exception_handler(404)
    async def custom_404_handler(request: Request, exc):
        """
        自定义404错误处理器
        对特定路径返回空响应，其他路径返回标准404错误
        
        :param request: 当前请求对象
        :param exc: HTTP异常对象
        :return: JSON响应
        """
        if request.url.path in ["/favicon.ico", "/.well-known/appspecific/com.chrome.devtools.json"]:
            return JSONResponse(content={}, status_code=200)
        return JSONResponse(content={"success": False, "error_type": "NOT_FOUND", "message": "请求的资源不存在"}, status_code=404)
    
    @app.get("/upload")
    def get_upload_page():
        """返回上传页面
        
        :return: 上传页面的文件响应
        """
        return FileResponse("static/upload.html")
    
    @app.get("/")
    @app.post("/")
    @app.get("/query")
    def get_query_page():
        """返回查询页面
        
        支持GET和POST方法，用于显示查询界面
        :return: 查询页面的文件响应
        """
        return FileResponse("static/query.html")
    
    @app.get("/category_page")
    def get_category_page():
        """返回分类管理页面
        
        :return: 分类管理页面的文件响应
        """
        return FileResponse("static/category.html")

    @app.get("/history_page")
    def get_category_page():
        """返回分类管理页面
        
        :return: 分类管理页面的文件响应
        """
        return FileResponse("static/history.html")        